为什么 fun 函数的 return 值是 8 而不是 7?
Why is the return value of the fun function 8 instead of 7?
参考 C 函数中 逗号分隔的 return 参数 [重复]
,
x=x+2,x+1;
将被评估为
x=x+2;
但是,如果是下面的代码
#include<stdlib.h>
#include<stdio.h>
int fun(int x)
{
return (x=x+2,x+1); //[A]
}
int main()
{
int x=5;
x=fun(x);
printf("%d",x); // Output is 8
}
不应该行[A],被评估为
x=x+2;
给予x = 7
语句return (x = x + 2, x + 1);
等同于:
x = x + 2; // x == 7
return x + 1; // returns 8
您方便链接的 QA 状态
The comma operator evaluates a series of expressions. The value of the
comma group is the value of the last element in the list.
所以价值
x+2,x+1;
是x+1
并且没有副作用。
示例代码:
#include<stdio.h>
int main(int argc, char * argv){
int x;
x = 0;
x = (x+2, x+1);
printf("%d\n", x);
return 0;
}
当 运行. 时 结果为 1
然而,当你这样做时
return (x=x+2, x+1)
你确实有副作用:x
先加2,然后x
加1,返回结果。
当写 return (x=x+2,x+1)
时,第一个表达式首先被求值,所以 x=x+2
被求值,导致 x 等于 7 作为副作用。然后计算并返回第二个表达式,因此函数 returns x+1 因此 returns 8.
如果你写 return (x+2,x+1);
,结果会是 6,因为第一个表达式 x+2
没有任何副作用。
return
中的两部分分别求值,最后一条指令的结果是returned:
首先我们有:
x = x + 2 // 7
现在 x
在第二次评估之前更新为 7
给出:
x + 1 // 7 + 1 = 8
最后 return 8
.
为了更好地理解中间变量的情况如下:
return (y = x + 2, y + 1);
正如其他用户所说,命令流从左到右,在 return
的情况下,它将返回最右边运算符中的值。在这个运算符之前写的,用逗号分隔的,和行写的表达式没什么区别。示例:
return (x = x + 2, x = x - 5, x + 1);
下面的代码产生相同的结果:
x = x + 2;
x = x - 5;
return x + 1;
对于 x = 0
,这将 return -2
。请注意,对于这两个代码,如果我们将 x = x - 5
更改为 x - 5
,即我们从 x
中减去 5
但不在任何地方保存其结果,return x
的值将更改为 3
,因此确认等效性。
这是运算符优先级的问题。
x=x+2,x+1
被评估为 (x=x+2), (x+1)
而不是 x=(x+2,x+1)
逗号运算符在您的代码中引入了一个序列点。这些语句按以下顺序计算:
x = x + 2
,此时fun
中的局部x
为7.
x + 1
,计算结果为 8,并返回。
为了澄清,这是一个显示运算符优先级的带括号的版本:
return (x=x+2),x+1;
计算左边的表达式并丢弃它的值。右侧表达式的值是返回值。
参考 C 函数中 逗号分隔的 return 参数 [重复] ,
x=x+2,x+1;
将被评估为
x=x+2;
但是,如果是下面的代码
#include<stdlib.h>
#include<stdio.h>
int fun(int x)
{
return (x=x+2,x+1); //[A]
}
int main()
{
int x=5;
x=fun(x);
printf("%d",x); // Output is 8
}
不应该行[A],被评估为
x=x+2;
给予x = 7
语句return (x = x + 2, x + 1);
等同于:
x = x + 2; // x == 7
return x + 1; // returns 8
您方便链接的 QA 状态
The comma operator evaluates a series of expressions. The value of the comma group is the value of the last element in the list.
所以价值
x+2,x+1;
是x+1
并且没有副作用。
示例代码:
#include<stdio.h>
int main(int argc, char * argv){
int x;
x = 0;
x = (x+2, x+1);
printf("%d\n", x);
return 0;
}
当 运行. 时 结果为 1
然而,当你这样做时
return (x=x+2, x+1)
你确实有副作用:x
先加2,然后x
加1,返回结果。
当写 return (x=x+2,x+1)
时,第一个表达式首先被求值,所以 x=x+2
被求值,导致 x 等于 7 作为副作用。然后计算并返回第二个表达式,因此函数 returns x+1 因此 returns 8.
如果你写 return (x+2,x+1);
,结果会是 6,因为第一个表达式 x+2
没有任何副作用。
return
中的两部分分别求值,最后一条指令的结果是returned:
首先我们有:
x = x + 2 // 7
现在 x
在第二次评估之前更新为 7
给出:
x + 1 // 7 + 1 = 8
最后 return 8
.
为了更好地理解中间变量的情况如下:
return (y = x + 2, y + 1);
正如其他用户所说,命令流从左到右,在 return
的情况下,它将返回最右边运算符中的值。在这个运算符之前写的,用逗号分隔的,和行写的表达式没什么区别。示例:
return (x = x + 2, x = x - 5, x + 1);
下面的代码产生相同的结果:
x = x + 2;
x = x - 5;
return x + 1;
对于 x = 0
,这将 return -2
。请注意,对于这两个代码,如果我们将 x = x - 5
更改为 x - 5
,即我们从 x
中减去 5
但不在任何地方保存其结果,return x
的值将更改为 3
,因此确认等效性。
这是运算符优先级的问题。
x=x+2,x+1
被评估为 (x=x+2), (x+1)
而不是 x=(x+2,x+1)
逗号运算符在您的代码中引入了一个序列点。这些语句按以下顺序计算:
x = x + 2
,此时fun
中的局部x
为7.x + 1
,计算结果为 8,并返回。
为了澄清,这是一个显示运算符优先级的带括号的版本:
return (x=x+2),x+1;
计算左边的表达式并丢弃它的值。右侧表达式的值是返回值。